#include "chatitembase.h"
#include <QGridLayout>
#include <QSpacerItem>

ChatItemBase::ChatItemBase(ChatRole role, QWidget *parent)
    : QWidget(parent)
    , _role(role)
{
    // 用户名
    _pNameLabel = new QLabel();
    _pNameLabel->setObjectName("chat_user_name");
    QFont font("Microsoft YaHei");
    font.setPointSize(9);
    _pNameLabel->setFont(font);
    _pNameLabel->setFixedHeight(20);

    // 用户头像
    _pIconLabel = new QLabel();
    _pIconLabel->setObjectName("chat_user_icon");
    _pIconLabel->setScaledContents(true);
    _pIconLabel->setFixedSize(42, 42);

    // 聊天气泡，之后会替换
    _pBubble = new QWidget(); // 不指定父窗口

    // 弹簧
    QSpacerItem * pSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); // 水平可拉伸，垂直最小

    // 网格布局
    QGridLayout * pGLayout = new QGridLayout;
    pGLayout->setVerticalSpacing(3);    // 组件之间的垂直间距
    pGLayout->setHorizontalSpacing(3);  // 组件之间的水平间距
    pGLayout->setMargin(3); // 组件与边界的间距

    if (_role == ChatRole::Self) {
        _pNameLabel->setContentsMargins(0, 0, 8, 0); // Label文本与右侧边界间距为8
        _pNameLabel->setAlignment(Qt::AlignRight); // 文本右对齐

        pGLayout->addWidget(_pNameLabel, 0, 1, 1, 1); // 用户名Label在0行1列，占1行1列
        pGLayout->addWidget(_pIconLabel, 0, 2, 2, 1, Qt::AlignTop); // 头像顶部对齐
        pGLayout->addWidget(_pBubble, 1, 1, 1, 1); // 管理_pBubble的内存
        pGLayout->addItem(pSpacer, 1, 0, 1, 1); // 弹簧放在第1行，和气泡挤压

        pGLayout->setColumnStretch(0, 2); // 拉伸比例，第0列占40%，第1列60%
        pGLayout->setColumnStretch(1, 3); // 即拉伸时第1列（气泡）优先变化
    }
    else {
        _pNameLabel->setContentsMargins(8, 0, 0, 0); // Label文本与左侧边界间距为8
        _pNameLabel->setAlignment(Qt::AlignLeft); // 文本左对齐

        pGLayout->addWidget(_pNameLabel, 0, 1, 1, 1); // 用户名Label在0行1列，占1行1列
        pGLayout->addWidget(_pIconLabel, 0, 0, 2, 1, Qt::AlignTop); // 头像顶部对齐
        pGLayout->addWidget(_pBubble, 1, 1, 1, 1);
        pGLayout->addItem(pSpacer, 1, 2, 1, 1); // 弹簧放在第1行，和气泡挤压

        pGLayout->setColumnStretch(1, 3); // 拉伸比例，第0列占40%，第1列60%
        pGLayout->setColumnStretch(2, 2); // 即拉伸时第1列（气泡）优先变化
    }

    this->setLayout(pGLayout);
}

ChatItemBase::~ChatItemBase()
{

}

void ChatItemBase::setUserName(const QString &name)
{
    _pNameLabel->setText(name);
}

void ChatItemBase::setUserIcon(const QPixmap &icon)
{
    _pIconLabel->setPixmap(icon);
}

void ChatItemBase::setWidget(QWidget *w)
{
    QGridLayout *pGLayout = qobject_cast<QGridLayout *>(this->layout());
    pGLayout->replaceWidget(_pBubble, w); // 替换掉原先的bubble
    delete _pBubble;    // 回收原先的气泡内存
    _pBubble = w;
}
